#pragma once

#include <QObject>
#include <QVariant>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <memory>

#define ResourceDataSPtr std::shared_ptr<ControlDB::ResourceData>
#define ResourceDataList QVector<std::shared_ptr<ControlDB::ResourceData>>

class ControlDB  : public QObject
{
	Q_OBJECT

public:
	enum PictureType
	{
		JPG,
		PNG,
		SVG
	};

	struct ResourceData
	{
		int id;
		QString name;
		QString svgContent;
		QByteArray pbgBuffer;
		PictureType picType;

		ResourceData()
		{
			id = 0;
			name = "";
			svgContent = "";
		}
	};

	// explicit 只能修饰含有一个参数的构造函数，或除第一个参数外其余参数都有默认值的构造函数。
	explicit ControlDB(QObject *parent = nullptr);
	~ControlDB(); 

	// 连接sqlite数据库
	bool ConnectNewDatabase(const QString& _dbFilePath);

	// 查询所有图片资源
	ResourceDataList QueryPictureDataList();
	// 根据名称模糊查询图像数据
	ResourceDataList QueryPictureByName(const QString& _name);
	// 查询图片数据，需要从base64转回去
	// 二进制数据有不可见字符，传来传去容易数据错误，base64是可见字符
	ResourceDataSPtr QueryPicById(const int& _id);
	// 导入图片资源，资源名称-图片buf
	void ImportPicture(const QString& _resName, const QByteArray& _dataBuf, const PictureType& _type);
	// 更新图片数据
	void UpdatePicData(const int& _id, const QString& _newName, const QByteArray& _newData = "");
	// 根据ID删除图片数据
	void DeletePicById(const int& _id);

	// 查询所有svg资源
	ResourceDataList QuerySvgDataList();
	// 根据名字模糊查询svg数据
	ResourceDataList QuerySvgByName(const QString& _name);
	// 查询SVG图片数据
	ResourceDataSPtr QuerySvgById(const int& _id);
	// 导入svg资源
	void ImportSvg(const QString& _resName, const QString& _fileContent);
	// 更新SVG数据
	void UpdateSvgData(const int& _id, const QString& _newName, const QString& _fileContent = "");
	// 根据ID删除数据
	void DeleteSvgById(const int& _id);

signals:

private:
	QSqlDatabase* resDb_;

};
